Skip to main content

数据类型:REFERENCE TO

重要

对于编译器版本 >= V3.3.0.0,引用被初始化(在 0 处)。

重要

如果引用是指设备输入,则该访问被应用为写访问。生成代码时,这会导致编译器警告:"...invalid assignment target”。

例子: rInput REF= Input;

如果您需要这种构造,则必须首先复制输入值(例如: rInput) 到具有写访问权限的变量。

与参考 REFERENCE 数据类型隐式引用另一个对象。作业是用 REF= 操作员.访问时,引用被隐式取消引用,因此不需要特殊的内容运算符 ^ 比如指针。

句法

<identifier> : REFERENCE TO <data type> ;
<data type>: base type of the reference
214. 有效声明
PROGRAM PLC_PRG
VAR
    rspeA : REFERENCE TO DUT_SPECIAL;
    pspeA : POINTER TO DUT_SPECIAL;
    speB : DUT_SPECIAL;
END_VAR
rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB);
rspeA := speD; // The code corresponds to pspeA^ := speD;


215. 无效的声明
ariTest : ARRAY[0..9] OF REFERENCE TO INT;
priTest : POINTER TO REFERENCE TO INT;
rriTest : REFERENCE TO REFERENCE TO INT;
rbitTest : REFERENCE TO BIT;


引用类型不得用作数组、指针或引用的基类型。此外,引用不得引用位变量。这些类型的结构会产生编译器错误。

注意

当通过标识符及其别名同时访问同一存储单元时,程序的可读性会变得困难。

例子: speBrspeA

提示

指向的引用和指针 BIT 变量是 无效 声明,以及具有基本类型的数组元素 BIT

216. 例子

当引用被分配时 :=,无论引用是在左侧、右侧还是两侧,始终都会复制值:

  • Ref := value 写入值 value 到参考点指向的位置。用指针表示法: Ref^ := value

  • value := Ref 之后写入引用指向的值 value。用指针表示法: value := Ref^

  • Ref1 := Ref2 写入的值 Ref2 指着。在那个位置 Ref1 指着。用指针表示法: Ref1^ := Ref2^

什么时候 REF= 使用时,始终应用地址,并且左侧必须有一个引用:

  • Ref REF= value: 参考点 value。用指针表示法: Ref :=ADR(value)

  • Ref1 REF= Ref2Ref1指向相同的值 Ref2。用指针表示法:Ref1 := Ref2

  • Value REF = Ref 导致编译错误



提示

在声明中, REFERENCE TO INT REF= value 表现得像 REFERENCE TO INT := value

引用和指针的比较

. 与指针相比,引用具有以下优点:
  • 更容易使用:

    引用可以直接访问被引用对象的内容,而无需取消引用。

  • 传递值时更精细和更简单的语法:

    调用一个功能块,它传递一个没有地址运算符而不是指针的引用

    例子: fbDoIt(riInput:=iValue);

    代替: fbDoIt_1(piInput:=ADR(iValue));

  • 类型安全:

    分配两个引用时,编译器会检查它们的基类型是否匹配。这在指针的情况下不被检查。

测试参考的有效性

您可以使用运算符 __ISVALIDREF 检查引用是否指向有效值(即不等于 0 的值)。

句法

<boolean variable name> := __ISVALIDREF( <reference name> );

<reference name>: 声明的标识符 REFERENCE TO

布尔变量是 TRUE 当引用指向一个有效值时。否则就是 FALSE.

PROGRAM PLC_PRG
VAR
    iAlfa : INT;
    riBravo : REFERENCE TO INT;
    riCharlie : REFERENCE TO INT;
    bIsRef_Bravo : BOOL := FALSE;
    bIsRef_Charlie : BOOL := FALSE;
END_VAR
iAlfa := iAlfa + 1;
riBravo REF= iAlfa;
riCharlie REF= 0;
bIsRef_Bravo := __ISVALIDREF(riBravo);  (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *)
bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)

提示

在编译器版本 3.5.7.40 及更高版本中,隐式监控功能 检查指针 作用于类型变量 REFERENCE TO 与指针变量相同。